package com.xxx.nio.nio;

import com.xxx.nio.utils.ByteBufferUtil;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.List;

/**
 * 非阻塞模式Server端
 */
@Slf4j
public class Server {

    public static void main(String[] args) throws IOException {
        // 0.创建ByteBuffer缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(16);

        // 1.创建Server端的SocketChannel
        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.configureBlocking(false);  // 非阻塞模式改动地方1：配置为非阻塞模式，影响的serverSc的accept()方法

        // 2.绑定Server端监听端口
        ssc.bind(new InetSocketAddress(8080));

        // 3.channel集合
        List<SocketChannel> channelList = new ArrayList<>();

        while (true) {
            // 4.创建SocketChannel，建立与Client端连接
            SocketChannel sc = ssc.accept();   // 非阻塞模式下，accept()方法返回null，线程会继续运行
            if(sc != null) {
                log.info("Server connected success from {}", sc);
                sc.configureBlocking(false);   // 非阻塞模式改动地方2：非阻塞模式，影响的是read()方法
                channelList.add(sc);
            }
           // 5.循环遍历所有的Channel，读取每一个Channel里的数据
            for (SocketChannel channel : channelList) {
                long len = channel.read(buffer);    // 非阻塞模式，read()方法返回0
                if(len > 0) {
                    log.info("read length:{}", len);
                    buffer.flip();  // 切换到读取模式
                    ByteBufferUtil.debugRead(buffer);  // 打印buffer
                    buffer.clear(); // 清空buffer（重置buffer到写模式）
                    log.info("after read...{}", channel);
                }
            }
        }

    }
}
